﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Scriptor.Presentation.Entity;

namespace Scriptor.Presentation.Templates
{
    public class ModelTemplate
    {
        List<string> gUsing { get; set; }
        public StringBuilder clausulaUsingFormatada { get; set; }

        List<string> gModel { get; set; }
        public StringBuilder modelFormatada { get; set; }

        List<string> gPropertie { get; set; }
        public StringBuilder propertieModelFormatada { get; set; }

        public string strUsing()
        {
            gUsing = new List<string>();

            gUsing.Add("using System;");
            gUsing.Add("using System.Collections.Generic;");
            gUsing.Add("using System.Text;");
            gUsing.Add("using Sinacor.Infra.UI.Common;");

            clausulaUsingFormatada = new StringBuilder();

            foreach (string str in gUsing)
            {
                clausulaUsingFormatada.Append(str);
                clausulaUsingFormatada.Append(Environment.NewLine);
            }

            return clausulaUsingFormatada.ToString();
        }

        public string strModel(string pNameSpace, string pClassName, bool showDecorators, bool showInheriting)
        {
            gModel = new List<string>();

            gModel.Add("namespace " + pNameSpace);
            gModel.Add("{");
            
            if(showDecorators)
                gModel.Add("\t[Serializable]");

            if(showInheriting)
                gModel.Add("\tpublic class " + pClassName + " : BaseModel");
            else
                gModel.Add("\tpublic class " + pClassName);

            gModel.Add("\t{");
            gModel.Add("@@class-body");
            gModel.Add("\t}");
            gModel.Add("}");

            modelFormatada = new StringBuilder();

            foreach (string str in gModel)
            {
                modelFormatada.Append(str);
                modelFormatada.Append(Environment.NewLine);
            }

            return modelFormatada.ToString();
        }

        public string strPropertie(Propriedades prpExterna, Entidade ent)
        {
            string concat = string.Empty;

            if (prpExterna.TipoPropriedade.IndexOf("Enum") != -1)
                concat = "DataContract.";

            Propriedades prp = new Propriedades(prpExterna.NomePropriedade, concat + prpExterna.TipoPropriedade);

            gPropertie = new List<string>();

            string open = "\t\t{";
            string close = "\t\t}";

            if (prp.TipoPropriedade.IndexOf("DataContract") != -1)
                prp.TipoPropriedade = "Model" + "." + prp.TipoPropriedade.Replace("DataContract.", "").Replace("Response.", "").Replace("Request.", "");

            if (prp.TipoPropriedade.IndexOf("Filtro") != -1)
                prp.TipoPropriedade = prp.TipoPropriedade.Replace("Filtro", "Parameter.Filtro");

            gPropertie.Add(string.Format("\t\tprivate {0} _{1};", prp.TipoPropriedade, prp.NomePropriedade.Substring(0, 1).ToLower() + prp.NomePropriedade.Substring(1)));
            gPropertie.Add(string.Format("\t\tpublic {0} {1}", prp.TipoPropriedade, prp.NomePropriedade));
            gPropertie.Add(open);
            gPropertie.Add("\t\t\tget { return this._@@prop; }".Replace("@@prop", prp.NomePropriedade.Substring(0, 1).ToLower() + prp.NomePropriedade.Substring(1)));
            gPropertie.Add("\t\t\tset { this._" + prp.NomePropriedade.Substring(0, 1).ToLower() + prp.NomePropriedade.Substring(1) + " = value; this.OnPropertyChanged(\"" + prp.NomePropriedade + "\"); }");
            gPropertie.Add(close);

            propertieModelFormatada = new StringBuilder();

            foreach (string str in gPropertie)
            {
                propertieModelFormatada.Append(str);
                propertieModelFormatada.Append(Environment.NewLine);
            }

            propertieModelFormatada.Append(Environment.NewLine);

            return propertieModelFormatada.ToString();
        }

        public string AppendProperties(string pClassScope, StringBuilder stb)
        {
            return pClassScope.ToString().Replace("@@class-body", stb.ToString());
        }
    }
}
